package models

import (
	"strconv"

	"time"

	"github.com/astaxie/beego/orm"
)

// 退票流程
// 1.检查参数
// 2.获取订单对象
// 3.获取用户对象
// 4.检查是否属于用户的个人订单
// 5.获取订单对应的航班的对象
// 6.检查是否符合退票程序
// 7.执行退票（不删除数据）
// *******************************************
// 返回状态值参数：
// 0：退票成功
// 1：退票失败，参数错误
// 2：退票失败，找不到相应的订单
// 3：退票失败，订单已完成退票
// 4：退票失败，账号信息错误（请重新登录）
// 5：退票失败，退票信息和登录信息不符合
// 6；退票失败，系统错误
func Refund(userid int64, orderid string) int8 {
	orderint, err := strconv.ParseInt(orderid, 10, 64)
	// userid, err := strconv.ParseInt(userid, 10, 64)
	if err != nil {
		// 1：退票失败，参数错误
		return 1
	}
	o := orm.NewOrm()
	qsorder := o.QueryTable("order")
	userorder := new(Order)
	err = qsorder.Filter("id", orderint).One(userorder)
	if err != nil {
		// 2：退票失败，找不到相应的订单
		return 2
	}
	if userorder.Cancel {
		// 3：退票失败，订单已完成退票
		return 3
	}
	qsuser := o.QueryTable("user")
	user := new(User)
	err = qsuser.Filter("id", userid).One(user)
	if err != nil {
		// 4：退票失败，账号信息错误（请重新登录）
		return 4
	}
	// 检查是否属于用户的个人订单
	if userid != userorder.UserId {
		// 5：退票失败，退票信息和登录信息不符合
		return 5
	}
	film, status := CheckFilm(userorder.FilmId)
	if status != 0 {
		//系统错误
		return 6
	}
	refunddate := time.Now()
	startdate := film.StartDate
	//两天前退票
	if startdate.YearDay()-refunddate.YearDay() >= 2 {
		user.Balance += userorder.TotalPrice
	} else {
		user.Balance += userorder.TotalPrice * 0.95
	}
	o.Update(user)
	userorder.Cancel = true
	userorder.UserId = 0
	userorder.Refundtime = refunddate
	o.Update(userorder)

	seat := new(Seat)
	qsseat := o.QueryTable("seat")
	err = qsseat.Filter("filmid", userorder.FilmId).Filter("userid", user.Id).One(seat)
	seat.UserId = 0
	seat.SeatStatus = false
	o.Update(seat)
	return 0
}
